package java01;

import org.junit.Test;

public class GenericTest {

    @Test
    public void test01(){
        Generic<Person> personGeneric = new Generic<>();
        Generic<? extends Comparable> generic=personGeneric;//带有子类型限定的通配符可以从泛型对象读取。
        System.out.println(generic.getFirst());
//        generic.setSecond(new Person());这句是不合法的，因为不知道具体的参数。Person子类型不能转换为一个能为严格的Comparable父类型

        Generic<Parent> comparableGeneric = new Generic<>();
        Generic<? super Person> superGeneric= comparableGeneric;//带有超类型限定的通配符可以向泛型对象写入
        superGeneric.setSecond(new Person());
        superGeneric.getFirst();//这句是不合理的，会将类型转回为一个Object
    }

    /*泛型使用super超类型限定通配符的情况。LocalDate实现了ChronoLocalDate，ChronoLocalDate扩展了Comparable<ChronoLocalDate>，因此LocalDate不能再扩展
    LocalDate<Comparable>，就可以使用超类型来补救*/
    public static <T extends Comparable<? super T>> T min(T[] a){//可以说T可以是一个实现了Comparable<ChronoLocalDate>的LocalDate
        return a[0];
    }

    @Test
    public void test02(){
        Generic generic1 = new Generic();
        Generic<?> generic = new Generic<>();
        generic.setSecond(null);
//        其区别在于可以用任意Object对象调用原始类setObject方法
        generic1.setSecond(generic);
//        generic.setSecond(generic1);
    }

    public static void main(String[] args) {

    }
}
